import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;


/**
 * TCP 回显服务器
 */
public class UdpEchoServer {
    // 创建一个 DatagramSocket 对象, 这个是后续网卡操作的基础
    private DatagramSocket socket = null;
    public UdpEchoServer(int port) throws SocketException {
        // 指定一个 端口号 给服务器程序
        this.socket = new DatagramSocket(port);
        // 这个是就是让系统自动分配一个端口
//        this.socket = new DatagramSocket();
    }
    // 通过这个方法, 就可以启动服务器
    public void start() throws IOException {
        System.out.println("服务器启动 !");
        while(true) {
            //1. 读取请求并解析
            // new bete[] 是指定一个缓冲区, 因为 DataframPacket 不会自动申请缓存区
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
            // 当 receive 完成之后, 数据都是 二进制 的形式存储到requestPacket 中了
            // 如果要想将数据给展示出来, 还需要将数据转换成二进制
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());
            // 2. 根据请求 计算响应 (一般服务器都会经历的过程)
            //    由于我们这里是回想服务器,请求是啥,响应就是啥
            String reponse = process(request);
            // 3. 把响应写入到 客户端
            // 我们这里是搞一个 DatagramPacket 对象, 往 DatagramPacket 里构造刚才的数据,再通过 send 返回
            DatagramPacket reponsePacket = new DatagramPacket(reponse.getBytes(),reponse.getBytes().length
                    ,requestPacket.getSocketAddress());
            socket.send(reponsePacket);
            // 4. 打印日志, 把这次数据交互的详细打印出来
            System.out.printf("[%s:%d] req=%s, resp=%s\n",reponsePacket.getAddress().toString(),reponsePacket.getPort(),
                    request,reponse);

        }
    }

    public String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer udpEchoServer = new UdpEchoServer(9090);
        udpEchoServer.start();
    }
}
